package com.ozq.common.other;

import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 
 * <HttpClient配置>
 * <p>
 * <功能详细描述>
 * 
 * @author 欧增奇
 * @version [版本号, 2017年10月16日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@Configuration
public class HttpClientConfig
{
    static Logger logger = LoggerFactory.getLogger(HttpClientConfig.class);

    /**
     * 首先实例化一个连接池管理器，设置最大连接数、并发连接数
     * 
     * @return
     */
    @Bean(name = "httpClientConnectionManager")
    public PoolingHttpClientConnectionManager getHttpClientConnectionManager()
    {
        return new PoolingHttpClientConnectionManager();
    }

    /**
     * 实例化连接池，设置连接池管理器。 这里需要以参数形式注入上面实例化的连接池管理器
     * 
     * @param httpClientConnectionManager
     * @return
     */
    @Bean(name = "httpClientBuilder")
    public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager") PoolingHttpClientConnectionManager httpClientConnectionManager)
    {

        // HttpClientBuilder中的构造方法被protected修饰，所以这里不能直接使用new来实例化一个HttpClientBuilder，可以使用HttpClientBuilder提供的静态方法create()来获取HttpClientBuilder对象
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();

        httpClientBuilder.setConnectionManager(httpClientConnectionManager);

        return httpClientBuilder;
    }

    /**
     * 注入连接池，用于获取httpClient
     * 
     * @param httpClientBuilder
     * @return
     */
    @Bean
    public CloseableHttpClient getCloseableHttpClient(@Qualifier("httpClientBuilder") HttpClientBuilder httpClientBuilder)
    {
        return httpClientBuilder.build();
    }

    /**
     * 使用builder构建一个RequestConfig对象
     * 
     * @param builder
     * @return
     */
    @Bean
    public RequestConfig getRequestConfig()
    {
        return RequestConfig.DEFAULT;
    }

}
